<?php
namespace core;


use core\database\driver\MySQLi;

/**
 * Class Factory
 * @package core
 * 工厂模式
 * 	  一个项目在创建一个类的时候，往往会被几十几百个文件调用
 * 并且以 new 的方式调用，所以修改起来就特别麻烦（维护性特别差）
 * 以 new 的方式调用，有些时候没必要多次实例化对象是对资源的
 * 一种浪费
 */
class Factory
{
	static function create()
	{
		$db = Db::getInstance();

		// 添加到注册树上
		Register::set('db', $db);

		return $db;
	}

	static function FactoryUser($id)
	{
		$key = sprintf("user_%s", $id);
		$user = Register::get($key);
		if (!$user) {
			$user = (new \core\model\User)->find($id);
			Register::set($key, $user);
		}
		return $user;
	}

    public static function getDatabase($id = 'master')
    {
        if ('slave' === $id) {
            $slaves = Config::get('database.slave');
            $conf = $slaves[ array_rand($slaves) ];
        } else {
            $conf = Config::get("database.{$id}");
        }

        $key = 'database_' . $id;
        $db = Register::get($key);
        if (!$db) {
            $db = new MySQLi();
            $db->connect(
                $conf['hostname'],
                $conf['username'],
                $conf['password'],
                $conf['database'],
                $conf['charsets']
            );
            Register::set($key, $db);
        }
        return $db;
    }
}



